package com.p2p.common;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "接口统一返回对象")
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class ResultDTO<T> {
    @ApiModelProperty(
            name = "code",
            notes = "状态码",
            dataType = "Integer")
    private Integer code;
    @ApiModelProperty(
            name = "msg",
            notes = "系统返回给用户的信息",
            dataType = "String")
    private String msg;
    @ApiModelProperty(
            name = "data",
            notes = "系统返回所携带的所有数据",
            dataType = "T 泛型 所返回的类型根据数据的不同而不同")
    private Map<String, T> data = new HashMap<>();

    /**
     * 其他方法会通过这个构造方法初始化一个Result DTO，所以必须在构造方法中声明
     *
     * @param code 返回的响应码
     * @param msg  返回的响应信息
     * @param data 返回的数据
     */
    public ResultDTO(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = new HashMap<>();
        this.data.put("data", data);
    }

    public ResultDTO add(T o) {
        return add("data", o);
    }

    /**
     * 为data添加数据，在添加的时候，流对象是从最后开始添加的，需要对Key和Value进行判断
     * 如果Key或者Value为空，则不添加
     * 如果data为空，则需要先初始化
     * 如果data不为空，则直接添加
     * @param key 添加的Key
     * @param value 添加的Value
     * @return 返回添加后的ResultDTO对象
     */
    public ResultDTO add(String key, T value) {
        if (Objects.isNull(key) || Objects.isNull(value))
            return this;
        if (Objects.isNull(data))
            data = new HashMap<>();
        data.put(key, value);
        return this;
    }

    public static ResultDTO success() {
        return new ResultDTO(200, "操作成功！", null);
    }

    public static ResultDTO success(String msg) {
        return new ResultDTO(200, msg, null);
    }

    public static ResultDTO failure() {
        return new ResultDTO(500, "服务器错误！", null);
    }

    public static ResultDTO failure(String msg) {
        return new ResultDTO(500, msg, null);
    }
}
